# -- encoding:utf-8 --
"""
Create by ibf on 2018/6/30
"""
import numpy as np

"""
总样本：10条数据
  是：3个样本
  否：7个样本
特征1：房产
  4个有房产
    0个是 4个否
  6个没有房产
    3个是 3个否
特征2：婚姻情况 
  4个单身 
    2个是 2个否
  3个已婚 
    0个是 3个否
  3个离婚
    1个是 2个否
特征3：年收入 60 75	 85	90	95	100	100	110	125	220
"""


def h(ps):
    """
    计算信息熵或者gini系数
    :param ps: 各个的概率值
    :return:
    """
    # return 1.0 - np.sum([p * p for p in ps])
    return np.sum([-p * np.log2(p) for p in ps])


print("寻找第一次的划分属性........")
info_d = h([0.3, 0.7])
print("在所有数据集中的目标属性的信息熵:{}".format(info_d))
# 遍历所有的特征，选择最优特征
# 1. 考虑特征一：房产 --> 计算条件熵
info_1_1 = h([1])
info_1_2 = h([0.5, 0.5])
info_1 = info_1_1 * 0.4 + info_1_2 * 0.6
print("在所有数据集中使用房产作为划分数据后的目标属性的信息熵:{}".format(info_1))
print("在所有数据集中使用房产作为划分的信息增益:{}".format(info_d - info_1))
# 2. 考虑特征二：婚姻情况  --> 计算条件熵
info_2_1 = h([0.5, 0.5])
info_2_2 = h([1])
info_2_3 = h([1 / 3, 2 / 3])
info_2 = info_2_1 * 0.4 + info_2_2 * 0.3 + info_2_3 * 0.3
print("在所有数据集中使用婚姻情况作为划分数据后的目标属性的信息熵:{}".format(info_2))
print("在所有数据集中使用婚姻情况作为划分的信息增益:{}".format(info_d - info_2))

# 3. 考虑特征二：年收入  --> 计算条件熵
info_3_1_1 = h([1])
info_3_1_2 = h([3 / 8, 5 / 8])
info_3_1 = info_3_1_1 * 0.2 + info_3_1_2 * 0.8
print("在所有数据集中使用年收入（80）作为划分数据后的目标属性的信息熵:{}".format(info_3_1))
print("在所有数据集中使用年收入（80）作为划分的信息增益:{}".format(info_d - info_3_1))
info_3_2_1 = h([2 / 5, 3 / 5])
info_3_2_2 = h([1])
info_3_2 = info_3_2_1 * 0.5 + info_3_2_2 * 0.5
print("在所有数据集中使用年收入（97.5）作为划分数据后的目标属性的信息熵:{}".format(info_3_2))
print("在所有数据集中使用年收入（97.5）作为划分的信息增益:{}".format(info_d - info_3_2))

# 选择第二个分割点
print("以房产作为划分的条件熵:")
print(0.2 * h([1]) + 0.8 * h([0.75, 0.25]))
print("以婚姻情况作为划分的条件熵：")
print(0.4 * h([0.5, 0.5]) + 0.4 * h([1]) + 0.2 * h([1]))
